#include<bits/stdc++.h> 
using namespace std;
//	所有二叉树的键都是唯一的正整数。现在给定一个后序遍历和中序遍历的队列，需要根据这俩队
//	列输出该二叉树层次遍历的结果
//1.每个输入都包含一个测试用例，对于每个测试用例，第一行给出一个正整数N<30，表示结点个数
//	第二行给出一个后序遍历序列，第三行给出中序遍历序列。 
//2.对于每个测试用例，在一行中输出该二叉树的层次遍历结果。
//3.二叉树、树的遍历、指针 
struct Node{	//二叉树的结点，包括数据、左子结点指针与右子结点指针 
	int data;
	Node* left=NULL;
	Node* right=NULL;
};
struct Tree{	//树，只有一个根结点指针 
	Node* root;
};
//关于树的遍历，后序遍历的最后一个结点是根节点，中序遍历的根节点在中间，先序遍历的根节点在第一个
//后序：左右根；中序：左根右；先序：根左右 
Node* buildTree(vector<int> post, vector<int> in){	//建树函数，传入一个后序和一个中序 
	if(post.size()==0) return NULL;	//如果传入的为空，则证明该位置的前继结点不存在这个子结点 
	Node* root = new Node;	//新建一个结点 
	root->data = post.back();	//后序遍历的最后一个点是根节点，且这个点在中序的中间 
	post.pop_back();	
	bool flag = false;	//用于在处理中序切分时候的标志 
	vector<int> in_left;	//中序的左半部分，用于生成左子结点 
	vector<int> in_right;	//中序的右半部分，用于生成右子结点 
	vector<int> post_left;	//后序的左半部分，用于生成左子结点 
	vector<int> post_right;	//后序的右半部分，用于生成右子结点 
	for(unsigned int i = 0;i<in.size();i++){	//遍历中序结果 
		if(in[i] == root->data){	//遇到根节点数据就转换压入的向量 
			flag = true;
			continue;
		}
		if(flag==false) in_left.push_back(in[i]);	//根节点前的都是左子树的
		else in_right.push_back(in[i]);	//根节点后的都是右子树的 
	}
	for(unsigned int i=0;i<in_left.size();i++){
		post_left.push_back(post[i]);	//后序遍历中取前面与中序前面等长的部分作为表示左子树的后序 
	}
	for(unsigned int i=in_left.size();i<in_left.size()+in_right.size();i++){
		post_right.push_back(post[i]);	//同理取出后面 
	}
	root->left = buildTree(post_left, in_left);	//递归建左子树 
	root->right = buildTree(post_right, in_right);	//递归建右子树 
	return root;	//返回该根节点 
}
void level_order(Node* node){	//层次遍历函数，通过传入根节点来做 
	queue<Node*> Q;	//结点指针的队列 
	vector<int> level;	//存结果的向量 
	Q.push(node);	//压入根结点 
	level.push_back(node->data);	//压入根结点表示的数据 
	while(true){
		if(Q.empty()) break;	//如果队列空了，则跳出循环 
		Node* newNode = Q.front();	//否则取队列首的结点出来 
		if(newNode->left!=NULL)	//如果它的左结点不为空 
		{
			Q.push(newNode->left);	//左结点压入队列 
			level.push_back(newNode->left->data);	//左结点表示的数据也压入向量 
		}
		if(newNode->right!=NULL){	//同理 
			Q.push(newNode->right);
			level.push_back(newNode->right->data);
		}	
		Q.pop();	//弹出队首 
	}
	for(unsigned int i=0;i<level.size();i++){	//所有的数据按照层次遍历的结果压入向量了，遍历输出 
		cout<<level[i];	
		if(i!=level.size()-1) cout<<" ";
		else cout<<endl;
	}
}
int main(){
	int N;
	cin>>N;
	vector<int> postorder;	//存后序遍历的序列 
	vector<int> inorder; 	//存中序遍历的序列 
	for(int i = 0;i<N;i++){
		int t;
		cin>>t;
		postorder.push_back(t);
	}
	for(int i = 0;i<N;i++){
		int t;
		cin>>t;
		inorder.push_back(t);
	}
	Tree tree;	//建树 
	tree.root = buildTree(postorder, inorder);	//建树 
	level_order(tree.root);	//遍历 
	return 0;
} 

